//
//  StatusDAL.swift
//  weibo1990
//
//  Created by 曹晓龙 on 15/10/30.
//  Copyright © 2015年 曹晓龙. All rights reserved.
//

import Foundation

/// 数据库信息保存最大天数
private let maxTime:NSTimeInterval = 60

/// 数据访问层,专门负责处理 本地数据库 数据 和网络数据加载
class StatusDAL {

    ///  加载微博数据-- 数据库 和 网络
    class func loadStatusData(since_id: Int, max_id: Int, finishBlock:(array:[[String : AnyObject]]?)->()){
     
        //1.判断数据是否有数据库缓存
        let array = checkoutCacheData(since_id, max_id: max_id)
        
        if array?.count > 0 {
            
            //2.有缓存,直接返回
            finishBlock(array: array!)
            
            print("从缓存中加载数据")
            
            return
        }
        //3.没有缓存.从网络加载数据
        CXLAFNMangerTool.sharedAFNMangerTool.loadHomeInfo(since_id: since_id, max_id: max_id) { (result, error) -> () in
            
            print("从网络加载数据")
            
            if error != nil {
                
                print("加载数据出错")
                
                finishBlock(array: nil)
                
                return
            }
            guard let array = result?["statuses"] as? [[String : AnyObject]] else{
                
                print("数据格式错误")
                
                finishBlock(array: nil)
                
                return
            }
            //4.将加载到的数据存储到数据库
            saveCacheData(array)
            
            //5.返回数据
            finishBlock(array: array)
        }
    }
    
    ///  检查数据库中 数据信息
    ///
    ///  - parameter since_id 若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
    ///  - parameter max_id 若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
    ///
    ///  - returns: 微博数据数组
    class func checkoutCacheData(since_id: Int, max_id: Int) -> [[String : AnyObject]]?{
        
        guard let userID = OauthViewModel.sharedOauthViewModel.oauthModel?.uid else{
            
            print("没有登录")
            return nil
        }        
        
        var sql = "SELECT StatusID, StatusJSON, USERID FROM T_Status\n"
        sql +=  "WHERE USERID = \(userID)\n"
        if since_id > 0{
            sql += "AND StatusID > \(since_id)\n"
        }else if max_id > 0{
            sql += "AND StatusID < \(max_id)\n"
        }
        sql += "ORDER BY StatusID DESC LIMIT 20;\n"
        
        
        let array =  CXLFMDBManager.sharedFMDBManger.selectedSQL(sql)
        
        var results = [[String : AnyObject]]()
        
        for dict in array {
            
            let json = try! NSJSONSerialization.JSONObjectWithData(dict["StatusJSON"] as! NSData, options: []) as! [String : AnyObject]
            
            results.append(json)
        }
        
        return results
    }
    
    ///  保存数据到数据库表格
    ///
    ///  - parameter array: array
    class func saveCacheData(array:[[String : AnyObject]]){
     
        // 1> 每条微博id
        // 2> 每条微博的json 数据
        // 3> 用户的userID
        
        guard let userID = OauthViewModel.sharedOauthViewModel.oauthModel?.uid else{
            print("没有登录")
            return
        }
        
        let sql = "INSERT OR REPLACE INTO T_Status (StatusID, StatusJSON, USERID) VALUES (?, ?, ?);"

        CXLFMDBManager.sharedFMDBManger.queue.inTransaction { (db, rollBack) -> Void in
            
            for dict in array{
                
                let statusID = dict["id"] as! Int

                let statusJSON = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
                
                if !db.executeUpdate(sql, statusID, statusJSON,userID){
                    print("插入数据失败")
                    rollBack.memory = true
                    break
                }
            }
        }
        print("插入数据成功")
    }
    
    ///  清空超出指定日期的数据缓存
    class func clearMermory(){
        
        let time = NSDate(timeIntervalSinceNow: -maxTime)
        
        let formatter = NSDateFormatter()
        
        formatter.locale = NSLocale(localeIdentifier: "en")
        
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
        let dateStr = formatter.stringFromDate(time)
        
        let sql = "DELETE FROM T_Status WHERE time < ?;"
        
        CXLFMDBManager.sharedFMDBManger.queue.inDatabase { (db) -> Void in
            
            if db.executeUpdate(sql, dateStr){
                
                print("选中了\(db.changes())条")
                
            }else{
                print("错误")
            }
        }
    }
}